const express = require('express')
//导入post 参数解析中间件
var bodyParser = require('body-parser')
//导入cookie-parser中间件
var cookieParser = require('cookie-parser')
//导入express-session
var session = require('express-session')

//引入connect-mongo
var MongoStore = require('connect-mongo')(session)



var app = express();
//JSON和URL编码的解析器添加为顶级中间件
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

//cookie进行加密或者 可选项的填写cookieParser(secret, options)
app.use(cookieParser())

//session参数设置
app.use(session({
    secret: 'keyboard cat', //加密的字符串 的签名
    name:'session_id',      //保存在本地cookie的一个名字 默认connect.sid 可以不设置
    resave: false,          //强制保存 session 即使它并没有变化,默认为true,建议设置成false
    saveUninitialized: true,    //强制将未初始化的session存储 建议设置成true
    //cookie: { secure: true }    //cookie参数设置,secure: true,https 才可以访问cookie
    store: new MongoStore({
        url:'mongodb://localhost:27017/yang',
        //延迟会话更新 通过这样做，设置touchAfter: 24 * 3600你说会话只在24小时内更新一次，无论发生多少请求（除了那些改变会话数据的东西）
        touchAfter: 24 * 3600 // 以秒为单位的时间段 
    })
  }))

//配置引擎使用ejs 模板引擎  ejs默认会在views目录里找模板
app.set("view engine","ejs")

//设置模板识别的位置
// app.set('views',__dirname+'/static')

//=======HTML当EJS文件使用=============================

//注册HTML模板引擎代码如下 没有必要
// app.engine('html',ejs._express);
//将模板引擎换成HTML代码如下
// app.set('view engine','html');

//======托管静态服务==本身也是个内置中间件===================

//设置ejs静态资源的路径访问映射  根目录下public目录下的所有静态文件资源就可以不顺利的访问了
app.use(express.static('public'));      //web目录不用输入public 
// app.use('/static',express.static('public'));    //将虚拟目录static目录替换public目录 提供给web访问 web目录需要输入static
//css连接 的时候 <link rel="stylesheet" href="css/style.css">  public目录下的css目录 可以放置 css,js,jpg类型文件

//=======================================
//ejs模板引擎提供给我们此方法,所有方法都可以访问的数据存储方式(全局数据)
//可以在任意方法里调用 如 登入成功的app.get方法中进行调用赋值
app.locals['userinfo'] ='1111';
req.app.locals['userinfo'] ='1111';
//=======================================

//中间件  在路由之前做的一系列操作   
//应用级中间件  next()继续向下匹配 匹配所有之前
//可以用做未登入的用户进行过滤 检测
app.use(function(req,res,next) {
    console.log('1'+new Date())
    next();
})
//也可以匹配指定的路由 匹配news之前
app.use('/news',function(req,res,next) {
    console.log('2'+new Date())
    next();
})


//首先匹配app.get("/news",(req,res)路由  在这个路由中间 匹配这个代next的路由
app.get("/news",(req,res,next)=>{
    
    console.log('路由中间件')
    next()

})


//===========================================
//参数传递给ejs页面
app.get("/",(req,res)=>{
    res.render('index',{
        name:'张珊' 
    })
    // res.send('首页访问'+'<h1>你好</h1>');

})

//get方式  /news/456方式传值
//localhost:3000/new
app.get("/news/:aid",(req,res)=>{
    res.send('get方式动态传值:'+req.params.aid);

})

//ejs 对数组的解析
app.get("/news",(req,res)=>{
    
    var arry = ['111','222','333'];

    res.render('news',{
        list:arry
    })
    

})

//localhost:3000/product?aid=456
app.get("/product",(req,res)=>{
    res.send('问号方式传值:'+req.query.aid);

})

//login登入 设置给ejs模板的参数  login.ejs 获取参数 返回给页面 在提交给logindata
app.get('/login',(req,res)=>{
    res.render('login',{username:'yangshuai',password:'123456'})
})

//body-parser解析 post提交的参数
app.post('/logindata',(req,res)=>{
    res.send('login param:'+ JSON.stringify(req.body))
})


//cookie的设置
app.get('/set',(req,res)=>{
    //参数1:名字
    //参数2:cookie的值
    //参数3:cookie的配置信息
    res.cookie('username','cookie的值',{maxAge:60000});
    res.send('你好');
})

//cookie的获取
app.get('/getcookie',(req,res)=>{

    console.log(req.cookies);
    res.send(req.cookies.username);
})


//设置session
app.get('/setsession',(req,res)=>{
    req.session.userinfo = "zhangsan111";   //设置session
    res.send("session设置成功");
})


//获取session
app.get('/getsession',(req,res)=>{
    res.send('session:'+req.session.userinfo);
})

//退出登入 销毁session
app.get('/logout',(req,res)=>{
    //使用maxAge过期时间销毁session
    // req.session.cookie.maxAge = 0;
    //使用session销毁函数进行销毁 session
    req.session.destroy(function (err) {
        console.log(err)
    })
    res.send('退出成功');       //send 附带返回响应头信息
    // res.end();               //end 没有附带响应头信息 编码乱码问题
    // res.redirect('/');   //重定向到的页面
})

//匹配所有路由之后
app.use(function(req,res) {
    console.log('3'+new Date())
    res.status(404).send('没有匹配的页面');
})

app.listen(3000,'localhost');